package com.execlTest.test2;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

/**
 * author : 冯孟活 ^_^
 * dates  : 2015年8月31日 下午8:48:47
 * class   : 读取Execl
 */
public class ReadExecl {
	
//	private final String XLSX = ".xlsx"; // 2007以上版本
//	private final String XLS = ".xls"; // 2003版本
	
	@Test
	public void readExeclTest() throws Exception{
		File file = new File("F:/execl/readTest2.xlsx"); 
		InputStream is = new FileInputStream(file); // 读取Execl
		
//		String suffix = file.toString().substring(file.toString().lastIndexOf("."),file.toString().length()); // 截取文件的后缀
//		Workbook wb = null; // 创建一个工作簿
//		if(XLSX.equals(suffix)) // 判断下 Execl 的后缀是那个版本
//			 wb = new XSSFWorkbook(is);
//		else if(XLS.equals(suffix))
//			 wb = new HSSFWorkbook(is);
//		else
//			throw new RuntimeException("貌似这不是Execl的后缀，请重新检查喔^_^");  // 如果不是Execl就上抛异常
		
		Workbook wb = WorkbookFactory.create(is); // 万能处理版本问题，如果不用 上面注释的准确度创建，就可以考虑这种方式（其实底层也是那样判定的）
		
		Sheet sheet = wb.getSheetAt(0); // 获取一个Execl里面的sheet默认从0开始，也可以通过name来获取wb.getSheet(String name);
		FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); // 创建公式计算器（用来判断获取Execl中的数据是什么类型）
		
		int firstRow = sheet.getFirstRowNum(); // 获取第一行
		int lastRow = sheet.getLastRowNum(); // 获取最后一行
		
		for (int i = firstRow; i <= lastRow; i++) {
			Row row = sheet.getRow(i); // 获取当前行
			int firstCell = row.getFirstCellNum(); // 获取第一个单元格
			int lastCell = row.getLastCellNum(); // 获取最后一个单元格
			for(int j = firstCell; j <= lastCell; j++){
				Cell cell = row.getCell(j); // 获取单元格
				CellValue cellValue = evaluator.evaluate(cell); // 计算当前的单元格是什么数据类型
				if(cellValue == null) // 如果execl的单元格是空则继续下次循环
					continue;
				switch (cellValue.getCellType()) {
				case Cell.CELL_TYPE_NUMERIC:
					if (DateUtil.isCellDateFormatted(cell)) {  // 这里的日期类型会被转换为数字类型，需要判别后区分处理
						try {
							new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat ("EEE MMM dd HH:mm:ss Z yyyy", Locale.UK).parse(cell.getDateCellValue().toString()));
							System.out.println("numeric转日期...");
						} catch (ParseException e) {
							e.printStackTrace();
						}
					} else {
						System.out.println("numeric类型...");
					}
					break;
				case Cell.CELL_TYPE_BOOLEAN:
					System.out.println("boolean类型...");
					break;
				case Cell.CELL_TYPE_STRING:
					System.out.println("string类型...");
					break;
				case Cell.CELL_TYPE_FORMULA:
					System.out.println("formula类型...");
					break;
				case Cell.CELL_TYPE_BLANK:
					System.out.println("blank类型...");
					break;
				case Cell.CELL_TYPE_ERROR:
					System.out.println("error类型...");
					break;
				default:
					break;
				}
			}
		}
		
		is.close(); // 记得关闭流，释放资源
	}
}
